/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modele.realisateur;

import java.util.ArrayList;
import java.util.List;
import modele.De;
import modele.ModeleYams;
import modele.ModeleYamsInterface;

/**
 * Classe RealisateurFull : Essaye de réaliser la combinaison Full
 * @author Khemon Beh & Florian Minin
 */
public class RealisateurFull extends RealisateurCombinaisonComplexe {

    /**
     * Attributs
     */
    List<Integer> valeurs;

    /**
     * Constructeur
     * @param modele
     */
    public RealisateurFull(ModeleYamsInterface modele) {
        super(modele);

        valeurs = new ArrayList();
        for (int i = 0; i < 6; i++) {
            valeurs.add(0);
        }
    }

    @Override
    public void realiseCombinaison() {
        boolean finTrois = false;
        boolean finDeux = false;
        int valMaxDeux, valMaxTrois, nbValTrois, nbValDeux;
        //Tant qu'il reste des lancers
        while (modele.getNbLanceDesRestant() > 0) {
            //On réinitialise les valeurs de recherche
            valMaxDeux = 0;
            valMaxTrois = 0;
            nbValTrois = 0;
            nbValDeux = 0;

            //On jette les des
            modele.jetteDes();
            List<De> ensembleDes = modele.getDes();

            //1er parcours : On récupère le nombre de dés
            //sorti pour chaque valeur
            for (De d : ensembleDes) {
                valeurs.set(d.getValeur() - 1, valeurs.get(d.getValeur() - 1) + 1);
            }

            //2ème parcours : On récupère les deux valeurs les plus
            //elevée
            int valeur = 1;
            for (int i : valeurs) {
                //Premier passage
                if (valeur == 1) {
                    valMaxDeux = valeur;
                    valMaxTrois = valeur;
                } else {
                    //Si la valeur du dé actuelle correspond
                    //a la valeur des dés composant le trio
                    if (i > valeurs.get(valMaxTrois - 1)) {
                        valMaxDeux = valMaxTrois;
                        valMaxTrois = valeur;
                    // Si la valeur du dé actuelle correspond
                    //a la valeur des dés composant le duo
                    } else if (i > valeurs.get(valMaxDeux - 1)) {
                        valMaxDeux = valeur;
                    }
                }
                valeur++;
            }

            //On supprime toutes les valeurs
            valeurs.clear();
            for (int i = 0; i < 6; i++) {
                valeurs.add(0);
            }

            //3ème parcours : On selectionne les dés dont la valeur
            //est égale a valMaxDeux ou valMaxTrois
            for (int i = 0; i < 5; i++) {
                if (modele.getValeurDes(i) == valMaxTrois) {
                    modele.selectDe(i + 1);
                    nbValTrois++;
                    if (nbValTrois == 3) {
                        finTrois = true;
                    }
                } else if (modele.getValeurDes(i) == valMaxDeux) {
                    modele.selectDe(i + 1);
                    nbValDeux++;
                    if (nbValDeux == 2) {
                        finDeux = true;
                    }
                }
            }

            //Si on a le full, on sort de la boucle
            if (finDeux && finTrois) {
                break;
            }
        }
    }
}
